#!/bin/bash
set -e

# ========================================================
# 🛠 Go 构建脚本（支持版本信息 + 自动复制配置）
# ========================================================

# ----------------------------
# 配置部分
# ----------------------------
CURRENT_DIR=$(pwd)                                   # 当前目录
APP_NAME="example"                                   # 二进制文件名
APP_DIR="$CURRENT_DIR/example"                       # 源码目录
OUTPUT_DIR="./output"                                # 输出目录
OLD_OUTPUT_DIR="$CURRENT_DIR/history_$APP_NAME"      # 历史目录（可改为其他路径）
CONF_DIR="$CURRENT_DIR/example/conf"                 # 配置目录
SH_DIR="$CURRENT_DIR/example/cmd/sh"                 # 脚本目录
RUN_SH="run.sh"                                      # 运行脚本
BUILD_TAGS=""                                        # go build 标签
GOOS=${GOOS:-$(go env GOOS)}                         # 操作系统
GOARCH=${GOARCH:-$(go env GOARCH)}                   # 架构
CGO_ENABLED=${CGO_ENABLED:-1}                        # 是否开启 CGO
LDFLAGS="-s -w"                                      # 去掉符号表和调试信息

# ----------------------------
# 版本信息注入
# ----------------------------
VERSION=$(git describe --tags --always --dirty 2>/dev/null || echo "v0.0.0")
BUILD_TIME=$(date +"%Y-%m-%d %H:%M:%S")
LDFLAGS="$LDFLAGS -X 'main.Version=$VERSION' -X 'main.BuildTime=$BUILD_TIME'"


# ----------------------------
# 构建阶段
# ----------------------------
echo "🧩  构建信息"
echo "操作系统: $GOOS"
echo "架构: $GOARCH"
echo "版本号: $VERSION"
echo "构建时间: $BUILD_TIME"
echo

# ----------------------------
# 前置检查
# ----------------------------
if ! command -v go >/dev/null 2>&1; then
    echo "❌  错误：未找到 Go，请先安装 Go 环境。"
    exit 1
fi

if [[ ! -d "$APP_DIR" ]]; then
    echo "❌  错误：构建目录不存在：$APP_DIR"
    exit 1
fi

ENV="$1"
if [[ -z "$ENV" ]]; then
    echo "❌   错误：$ENV 请指定环境参数（dev 或 prod）"
    echo "用法：$0 [dev|prod]"
    exit 1
fi

# ----------------------------
# 判断配置文件是否存在
# ----------------------------
SRC_FILE="$CONF_DIR/$ENV.yaml"
DEST_FILE="$OUTPUT_DIR/config.yaml"

if [[ ! -f "$SRC_FILE" ]]; then
    echo "❌  找不到配置文件: $SRC_FILE"
    exit 1
fi

if [[ ! -f "$SH_DIR/$RUN_SH" ]]; then
    echo "❌  找不到项目启动文件: $SH_DIR/$RUN_SH"
    exit 1
fi

# ----------------------------
# 创建输出目录并打包
# ----------------------------
if [[ -d "$OUTPUT_DIR" ]]; then
   DATE_STR=$(date +"%Y-%m-%d_%H-%M-%S_%3N")      # 当前时间
   OLD_OUTPUT_FILE="${DATE_STR}.zip"              # 压缩包名称
   if [[ ! -d "$OLD_OUTPUT_DIR" ]]; then
      mkdir $OLD_OUTPUT_DIR
   fi
   zip -r "$OLD_OUTPUT_DIR/$OLD_OUTPUT_FILE" "$OUTPUT_DIR" >/dev/null
   echo "✅  历史项目打包完成：$OLD_OUTPUT_DIR/$OLD_OUTPUT_FILE"
   rm -rf "$OUTPUT_DIR"
fi

# ----------------------------
# 复制配置文件
# ----------------------------
mkdir -p "$OUTPUT_DIR"
cp "$SRC_FILE" "$DEST_FILE"
echo "✅  配置文件已复制：$SRC_FILE → $DEST_FILE"

# ----------------------------
# 复制项目启动文件
# ----------------------------
if [[ -f "$SH_DIR/$RUN_SH" ]]; then
    cp "$SH_DIR/$RUN_SH" "$OUTPUT_DIR/"
    chmod +x "$OUTPUT_DIR/$RUN_SH"
    echo "✅  复制项目启动文件：$SH_DIR/$RUN_SH → $OUTPUT_DIR"
else
    echo "⚠️  未找到项目启动文件：$SH_DIR/$RUN_SH"
fi

# ----------------------------
# 构建项目
# ----------------------------
env CGO_ENABLED=$CGO_ENABLED GOOS=$GOOS GOARCH=$GOARCH go build \
    -tags "$BUILD_TAGS" \
    -ldflags "$LDFLAGS" \
    -o "$OUTPUT_DIR/$APP_NAME" \
    "$APP_DIR"/main.go
echo "✅  项目构建完成：$OUTPUT_DIR/$APP_NAME"
echo

# 设置文件夹权限
chmod -R +x "$OUTPUT_DIR/$APP_NAME"

# ----------------------------
# 结束提示
# ----------------------------

echo  "👉  运行示例：$OUTPUT_DIR/$APP_NAME -c config.yml"
echo  "⭐️  脚本命令："
echo "  (后台)启动: $OUTPUT_DIR/run.sh start"
echo "  (前台)启动: $OUTPUT_DIR/run.sh start foreground"
echo "  停止服务: $OUTPUT_DIR/run.sh stop"
echo "  重启服务: $OUTPUT_DIR/run.sh restart"
echo "  查看状态: $OUTPUT_DIR/run.sh status"
echo  "🎉  构建完成！输出目录：$OUTPUT_DIR"
